#include "cmath.h"
#include <list>
#include "poly2tri/poly2tri.h"
//векторное произведение
//=========================================================================
double vec_mult( Point &a, Point &b, Point &c)
{
    return (a.x*b.y - a.x*c.y - b.x*a.y + b.x*c.y + c.x*a.y - c.x*b.y );
}

//скалярное произведение
//=========================================================================
double scal_mult( Point &a, Point &b, Point &c )
{
    return( (c.x - b.x)*(a.x - b.x) + (c.y - b.y)*(a.y - b.y) );
}

//функция определяет принадлежность точки point треугольнику t1_t2_t3
//=========================================================================
bool isInTriangle( Point &point,  Point &t1, Point &t2, Point &t3 )
{
    double a, b, c;
    a = vec_mult( point, t1, t2 );
    b = vec_mult( point, t2, t3 );
    c = vec_mult( point, t3, t1 );
    //Если все три двойки векторов однонаправленные, то point внутри треугольника
    return ( a < 0 && b < 0 && c < 0 || a > 0 && b > 0 && c > 0 );
}

//=========================================================================
bool isInTriangle(Point *p, Triangle *t)
{
    return isInTriangle(*p,*t->p1,*t->p2,*t->p3);
}

//функция определяет направление обхода многоугольника
//=========================================================================
bool clwDirection(const std::vector <Point> points)
{
    double maxx =points[0].x;
    int maxi = 0;

    Point p1, p2, p3, px;

    //находим точку с максимальным значением по Х
    for( int i = 0; i < points.size(); i++ )
    {
       if( maxx < (points[i].x ))
        {
            maxx = points[i].x;
            maxi = i;
        }
    }

    p1 = points[maxi];
    p2 = points[(maxi+1) % points.size()];
    p3 = points[(maxi+2)% points.size()];
    //с помощью векторного произведения определяем
    //направление тройки векторов
    if( vec_mult( p1, p2, p3 ) > 0 )
        return true;

    return false;
}

double dabs( double val)
{
    return val>0 ? val : -val;
}

double distance(Point &p1, Point &p2)
{
    return sqrt(((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y)));
}
